
package com.sailing.lianxi.thread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * 创建线程方式3-Callable接口方式
 * @author Administrator
 *
 */
public class CallableAndFutureTask {
   public static void main(String[] args) {
	   for(int i=0;i<29;i++) {
		   FutureTask<Integer> ft = new FutureTask<Integer>(new MyCallable());
		   Thread th = new Thread(ft,""+i);
		   th.start();
		   try {
			   Integer result = null;
				//  调用FutureTask的get() 方法 获取线程的计算结果
				//  如果线程没有计算完结果 则get()方法会阻塞 直到线程计算完结果返回
				//Integer result = ft.get();
				
				//  get(long timeout, TimeUnit unit)方法在指定时间内获取线程计算结果，超时则抛出 TimeoutException异常
				//  如果运行计算结果的线程被中断则get()和get(long timeout, TimeUnit unit)方法都将抛出InterruptedException异常
				try {
					 result = ft.get(10000, TimeUnit.MILLISECONDS);
				} catch (TimeoutException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				/**
				 * th.getName() 返回线程的名称
				 * th.currentThread().getName() 返回的是当前线程的名称，及主线程名称main
				 */
				System.out.println("线程"+th.getName()+"：result="+result);
				System.out.println();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ExecutionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	   }
   }
}

